﻿// ***********************************************************************
// Assembly         : INNOVACALL.Framework.Common
// Author           : LJO+01 (Laurent Jordi)
// Created          : 06-05-2013
// Last Modified By : LJO+01 (Laurent Jordi)
// Last Modified On : 06-05-2013
// ***********************************************************************
// <copyright file="HtmlResolver.cs" company="Copyright © Innovacall 2011">
//     Copyright (c) Copyright © Innovacall 2011. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
using System;
using System.Xml;

namespace INNOVACALL.Framework.Common.XMLTools
{
    /// <summary>
    /// Class HtmlResolver
    /// </summary>
	public class HtmlResolver : XmlUrlResolver
	{
        /// <summary>
        /// Mappe un URI vers un objet contenant la ressource réelle.
        /// </summary>
        /// <param name="absoluteUri">URI retourné par <see cref="M:System.Xml.XmlResolver.ResolveUri(System.Uri,System.String)" /></param>
        /// <param name="role">L'implémentation en cours n'utilise pas ce paramètre lors de la résolution des URI.Ceci est fourni pour des extensibilités futures.Par exemple, ceci peut être mappé vers xlink:role et utilisé comme remarques propres à l'implémentation dans d'autres scénarios.</param>
        /// <param name="ofObjectToReturn">Type d'objet à retourner.L'implémentation en cours ne retourne que les objets System.IO.Stream.</param>
        /// <returns>Objet System.IO.Stream ou null si un type autre que stream est spécifié.</returns>
		public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
		{
			if (absoluteUri.AbsoluteUri.Equals("urn:XHTMLEntities", StringComparison.OrdinalIgnoreCase))
			{
				//ensure the embedded resource is suitably namespaced
				return System.Reflection.Assembly.GetExecutingAssembly().
					GetManifestResourceStream("Library.ParseXHtml.xhtml-entities.ent");
			}
			return null; //we don't return any other external resources
		}

        /// <summary>
        /// Résout l'URI absolu à partir des URI de base et relatifs.
        /// </summary>
        /// <param name="baseUri">URI de base utilisé pour résoudre l'URI relatif.</param>
        /// <param name="relativeUri">URI à résoudre.L'URI peut être absolu ou relatif.S'il est absolu, cette valeur remplace effectivement la valeur de <paramref name="baseUri" />.S'il est relatif, il se combine à <paramref name="baseUri" /> pour produire un URI absolu.</param>
        /// <returns><see cref="T:System.Uri" /> représentant l'URI absolu ou null si l'URI relatif ne peut pas être résolu.</returns>
		public override Uri ResolveUri(Uri baseUri, string relativeUri)
		{
			//make all the XHTML urls resolve to the single "dtd" which is actually just the entities
			if (relativeUri.Equals("-//W3C//DTD XHTML 1.0 Transitional//EN", StringComparison.OrdinalIgnoreCase)
				|| relativeUri.Equals("-//W3C//DTD XHTML 1.0 Strict//EN", StringComparison.OrdinalIgnoreCase)
				|| relativeUri.Equals("-//W3C//DTD XHTML 1.0 Frameset//EN", StringComparison.OrdinalIgnoreCase)
				|| relativeUri.Equals("-//W3C//DTD XHTML 1.1//EN", StringComparison.OrdinalIgnoreCase))
			{
				return new Uri("urn:XHTMLEntities");
			}
			return base.ResolveUri(baseUri, relativeUri);
		}
	}
}
